// 基于axios封装网络请求
import theAxios from 'axios'
// 得到token
import {
  getToken,
  removeToken,
  setToken
} from './token'

import {
  getNewTokenAPI
} from '@/api'

import {
  Notify
} from 'vant'

// 引入路由
import router from '@/router'

const axios = theAxios.create({
  baseURL: 'http://toutiao.itheima.net',
  timeout: 20000
})
// 添加请求拦截器
axios.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么
  if (getToken()?.length > 0 && config.headers.Authorization === undefined) {
    config.headers.Authorization = `Bearer ${getToken()}` // 在发起请求之前添加请求头
  }
  return config
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 添加响应拦截器
axios.interceptors.response.use(function (response) {
  // 对响应数据做点什么
  return response
}, async function (error) {
  // 对响应错误做点什么
  if (error.response.status === 401) { // 401 token失效，重新登录
    removeToken()
    const res = await getNewTokenAPI() // 刷新token接口
    setToken(res.data.data.token) // 设置新的token
    error.config.headers.Authorization = `Bearer ${getToken()}` // 请求头中添加token
    return axios(error.config) // 调用上次token失效未执行的操作
    // 如果刷新token失效则退出登录
  } else if (error.config.method === 'put' && error.config.url === '/v1_0/authorizations' && error.response.status === 500) {
    removeToken()
    router.replace('/login')
    Notify({
      type: 'warning',
      message: '身份失效'
    })
  }
  return Promise.reject(error)
})
// 高级的设计模式
// --应用场景--
// 假如不使用axios请求，使用jquery中的ajax请求，这样就可以用一个中间量接收进行替换
export default ({
  url,
  method = 'GET',
  params = {},
  data = {},
  headers = {}
}) => {
  return axios({
    url,
    method,
    params,
    data,
    headers
  })
}
